RepChain应用开发

11.1 编写第一个应用

11.1.1 应用概况

基于RepChain的分布式图片版权保护应用,主要实现用户的区块链账户管理以及图片存证两大功能。账户管理功能旨在让用户拥有自己的区块链密钥对以及证书,证书验证通过RepChain验证后, 用户便可以发起存证交易。图片存证功能将利用用户的私钥对图片存证交易做签名,若该图片在应用中为首次提交,应用将在区块链中成功登记图片版权,否则返回提示信息该图片信息版权已在系统中注册过。

11.1.2 总体设计

1). 需求概述

本项目的开发目标,是构建基于区块链网络系统的图片版权保护应用系统。即实现不受特定中心化服务管理机构控制,由联盟共建、共同维护的, 能提供在线图片版权保护服务的应用系统。该目标应用系统,由应用客户端和区块链网络服务端构成,其核心功能是为用户提供去中心化的图片版权记录操作相关服务, 包括账户管理、图片版权登记以及图片版权授权记录服务。

应用系统总体交互流程如下:

交易执行交互示意图
  1. 图片版权保护应用客户端面向用户,用户通过该应用程序提供的交互接口进行图片版权相关操作;
  2. 图片版权保护应用客户端将用户的各项图片版权相关操作映射为对应的区块链transaction交易,并将该交易传递给底层区块链网络服务端;
  3. 区块链网络对来自应用程序的交易transaction进行执行运算,最终形成防篡改的图片版权记录信息,并将结果状态返回给图片版权保护应用客户端,向用户显示结果。

2). 系统架构

系统架构图

区块链代理节点使用p2p模式组网,节点间通过同步共识共同维护可信的登记和交易记录,节点利用C/S模式接收客户端的登记版权请求。

当某个用户想登记版权时,利用客户端提供的版权登记功能提交一个请求,请求被代理节点接收并验证以后,广播到整个区块链网络中。 同时节点将把所有已上链存证的图片通过C/S模式推送给其他客户端,以便其查看所有已经登记了的图片。

3). 系统模型如下:

应用系统基于Nodejs及其相关开源组件进行客户端各功能模块的开发,其底层区块链网络基于已有的许可类型区块链基础组件RepChain来构建, 并使用javascript或者scala编写智能合约。应用目前主要包括以下功能模块:

  • 应用客户端:

    • 用户账户管理

      • 用户注册
      • 证书查看
      • 证书下载
      • 私钥下载
      • 密码修改
      • 管理员注册用户证书
      • 管理员更新用户证书
      • 管理员注销用户证书
    • 图片版权登记

      • 查看图片和版权信息
      • 多功能搜索
  • 区块链网络服务端:

    • 图片版权保护智能合约

      • 用户注册合约方法
      • 用户证书更新合约方法
      • 注销用户证书合约方法
      • 图片版权登记合约方法
系统模型 应用技术架构

如上图所示,应用的账户管理模块为上图的左半部分,用户打开应用后,若应用本地有其证书以及加密后的私钥文件, 用户在登录界面上选择账号并填写密码,密码解密私钥文件,私钥文件验证对应证书中的签名,若签名正确表明验证通过, 用户成功登陆,否则要求用户创建新证书或导入证书。

用户创建证书及私钥文件时,到注册页面上填写个人信息,应用生成私钥及证书,随后要求用户导出私钥及证书, 用户将证书离线提交给RepChain节点,节点验证通过后将用户证书加入信任列表中,用户即可登录。

应用的版权登记模块为上图的右半部分,用户来到版权登记界面后,选择提交的图片并填写图片相关的信息, 应用将检测图片是否已经被注册过,若已被他人注册,向用户返回提示信息,否则应用调用存证智能合约, 向RepChain提交存证交易,RepChain节点接收到存证交易后,验证用户证书是否在信任列表中以及交易中的签名是否正确, 若正确则成功上链存证,并向应用返回出块通知,向用户告知版权存证成功。

4). 应用技术架构

UI与RepChain的数据交互

如上图所示,图片版权应用是一款web程序,采用Meteor框架进行开发,构建在node.js上,数据库为indexedDB, 用户界面使用ReactJS,利用MaterialUI组件搭建,应用通过RestAPI调用RepChain节点提供的Restful接口服务, 通过WebSocket订阅/推送接收RepChain的事件订阅服务。

RepChain选用JDK1.8作为支撑组件,系统实现采用AKKA的Actor模型,编程语言采用Scala,Scala运行在Java虚拟机上, 轻松地和Java类库互联互通。账本存储采用LevelDB,实现区块数据的快速检索,组网采用去中心化的Gossip协议。 节点对外提供Restful接口服务以及事件订阅服务。

11.1.3 程序设计

针对上述应用系统的各个功能模块,进行设计。首先将整个目标应用系统分为两个部分,即应用客户端与区块链网络服务端口。 应用客户端是指直接面向用户的应用程序,提供图片版权相关的操作接口。这里的区块链网络服务端, 主要是关注处理图片版权相关操作业务的智能合约,不涉及区块链平台的底层结构的内容。

11.1.4 应用客户端

1)用户账户管理模块

用户账户管理模块主要针对现有应用的密钥托管模式所存在的问题,以及联盟链场景下的许可认证需求进行设计。

现有的加密数字货币交易所基本上都集中式地托管了其用户的账户密钥对,即这些交易所服务端保留存储了其用户的私钥, 而这些用户私钥是操纵用户个人数字货币资产的唯一凭证。一旦这些被托管的用户私钥被黑客或内部工作人员盗取, 用户将承受巨大损失。例如曾经是当时世界最大比特币交易所的MtGox,因对其托管的用户密钥对管理存在严重漏洞, 导致用户损失大量比特币而最终破产。此外,许多基于以太坊的去中心化应用DApp,也在其面向用户的服务端托管了用户的密钥对, 这样的结构存在很高的风险性。针对该托管结构存在的风险问题,本目标应用系统将用户密钥对尤其是私钥的存储管理功能实现非托管化, 让用户自己负责管理自己的私钥信息安全。此外,本应用系统场景是基于联盟链的,需要对用户的注册信息进行核对认证。

用户账户管理模块功能逻辑流程图

2)图片版权登记模块

图片版权登记模块,为用户申请数字图片版权登记记录提供操作接口。该登记记录将在底层区块链网络中得到共识, 最终形成防篡改的版权登记记录。

鉴于数字图片文件对存储空间有较大的要求,而若区块链用来直接存储数字图片文件,将直接影响区块链网络性能。 所以采用区块链存储数字图片文件hash值的方式,数字图片文件hash值作为其数字指纹,成为其唯一标识, 被存储于版权登记信息中。下图是图片版权登记模块工作逻辑流程图。

图片版权登记模块工作逻辑流程图

11.1.5 区块链网络服务端

区块链网络服务端,是以RepChain区块链平台为基础搭建的区块链网络。其中部署了图片版权保护智能合约, 该合约作为处理应用客户端相应请求的服务逻辑实现,在区块链网络中各个节点上运行执行,最终达成防篡改的共识处理结果。

图片版权保护智能合约中,主要设计定义了用户注册方法以及图片版权登记方法。

1)用户注册合约方法

signup方法以用户证书信息为参数,以该信息为key,检查是否已存在该证书记录。通过检查则将用户证书信息加入worldstate中, 表示该用户已注册成功,该用户账户即取得后续版权登记操作的权利。

2) 用户证书更新合约方法

replaceCert方法以更新后的用户证书信息和账户短地址为参数,检查是否已存在该证书记录,并替换为新的证书。 通过检查则将用户证书信息加入worldstate中,表示该用户证书已更新成功,该用户账户即继续后续版权登记操作。

3) 注销用户证书合约方法

destroyCert方法以账户短地址为参数,检查是否已存在该短地址对应的证书记录,并置空。表示该用户证已注销, 该用户账户无权进行后续版权登记相关操作。

4)图片版权登记合约方法

put_proof方法以用户选择的数字图片文件唯一标识以及版权登记相关描述信息为参数,以该唯一标识为key, 检查是否已经存在与该标识相关的版权记录。通过检查则将参数信息作为k-v信息对加入worldstate中,表示该版权登记请求已成功。

11.1.6 开发环境

  • 开发语言:

    • 应用客户端:nodejs 8.9.0
    • 服务端合约:javascript
  • 应用客户端开发框架及组件:

    • 后端:Meteor 1.6
    • 前端:React 15.6.2、MaterialUI 0.16.7
    • protobuf工具:protobufjs 6.8.0
    • 密钥对、证书生成工具:jsrsasign 8.0.4
    • 签名工具:Nodejs Crypto Module
  • IDE

    • vscode
  • 版本管理

    • git

11.2 应用效果展示

11.2.1 用户管理

用户注册 导入证书文件 用户管理 图片存证 图片存证